

// 使用 Object.defineProperty 属性 （定义属性的方法）
function defineProperty() {
  var _obj = {}
  var a = 1

  // Object.defineProperty(obj, prop, descriptor) // 对象 、 属性 、描述项集合
  // 每个属性定义的时候 都有 getter setter 机制
  // 数据劫持 指的是 借助getter和setter方法，改变之前的访问逻辑

  Object.defineProperties(_obj, {
    a: {
      get() { // 当出现getter、setter时，不能同时出现 value、writable 会冲突并报错
        console.log('a得到值时是' + a)
        return a
      },
      set(newVal) {
        a = newVal
        console.log('The value "a" has been designed a new value ------>' + a)
      }
    },
    b: {
      value: 3, // 定义的值，以下属性都默认为 false 意味着 默认只读
      writable: false, // 能否修改
      enumerable: false, // 能否遍历
      configurable: false // 能否删除
    }
  })

  return _obj
}

var obj = defineProperty()
console.log(obj.a)

obj.a = 2


function DataArr() {
  var _val = null // obj
  var _arr = []

  Object.defineProperty(this, 'val', {
    get() {
      return _val
    },
    set(newVal) {
      _val = newVal
      _arr.push({ val: _val })
      console.log('The _arr has been push a new value ------>' + _val)
    }
  })

  this.getArr = function() {
    return _arr
  }

}

var dataArr = new DataArr()
dataArr.val = 123
dataArr.val = 456
console.log(dataArr.getArr())
